package com.jaws.core.common.util;

import java.math.BigDecimal;
import java.math.RoundingMode;

import org.apache.commons.lang3.StringUtils;

/**
 * 
 * 金额处理Helper类（元转分， 分转元）
 * @author lixin
 * @date 2018-04-24 16:55:53
 * @since v1.0.0
 */
public class AmountUtil {

	private static BigDecimal VALUE_100 = new BigDecimal("100.0");

	/**
	 * 金额由元转分
	 *
	 * @param amount
	 * @author qinqz
	 * @date 2017/3/20
	 * @return
	 */
	public static double yuanToFen(double amount) {
		return new BigDecimal(Double.toString(amount)).multiply(VALUE_100).setScale(0, RoundingMode.HALF_UP).doubleValue();
	}

	/**
	 * 金额由元转分
	 *
	 * @param amount
	 * @author qinqz
	 * @date 2017/3/20
	 * @return
	 */
	public static long yuanToFenLong(double amount) {
		return new BigDecimal(Double.toString(amount)).multiply(VALUE_100).setScale(0, RoundingMode.HALF_UP).longValue();
	}

	/**
	 * 金额由元转分（只是做单位转换，四舍五入由调用方决定）
	 * 
	 * @author changxd
	 * @date 2017-05-04
	 * @since 1.0.0
	 * @param amount
	 * @return
	 */
	public static int yuanToFen(int amount) {
		return new BigDecimal(Long.toString(amount)).multiply(VALUE_100).setScale(0, RoundingMode.HALF_UP).intValue();
	}

	/**
	 * 金额由元转分
	 *
	 * @param amount
	 * @author wanghao
	 * @date 2017/3/20
	 * @return
	 */
	public static String yuanToFen(BigDecimal amount) {
		if (null == amount) {
			return "0";
		}
		return amount.multiply(VALUE_100).setScale(0, RoundingMode.HALF_UP).toPlainString();
	}

	/**
	 * 金额由元转分
	 *
	 * @param amount
	 * @author jiangmyc
	 * @date 2017/8/5
	 * @return
	 */
	public static BigDecimal yuanToFenDecimal(BigDecimal amount) {
		if (null == amount) {
			return BigDecimal.ZERO;
		}

		return amount = amount.multiply(VALUE_100).setScale(2, RoundingMode.FLOOR);
	}

	/**
	 * 金额由元转分（只是做单位转换，四舍五入由调用方决定）
	 * 
	 * @author changxd
	 * @date 2017-05-04
	 * @since 1.0.0
	 * @param amount
	 * @return
	 */
	public static long yuanToFen(long amount) {
		return new BigDecimal(Long.toString(amount)).multiply(VALUE_100).setScale(0, RoundingMode.HALF_UP).longValue();
	}

	/**
	 * 金额由元转分
	 *
	 * @param amount
	 * @author wanghao
	 * @date 2017/3/20
	 * @return
	 */
	public static String yuanToFen(String amount) {
		if (StringUtils.isBlank(amount)) {
			return "0";
		}

		return yuanToFen(new BigDecimal(amount));
	}

	/**
	 * 金额由元转分
	 *
	 * @param amount
	 * @author qinqz
	 * @date 2017/3/20
	 * @return
	 */
	public static double fenToYuan(double amount) {
		return new BigDecimal(Double.toString(amount)).divide(VALUE_100).setScale(2, RoundingMode.FLOOR).doubleValue();
	}

	/**
	 * 金额由分转元（只是做单位转换，四舍五入由调用方决定）
	 *
	 * @param amount
	 * @author wanghao
	 * @date 2017/3/20
	 * @return
	 */
	public static String fenToYuan(BigDecimal amount) {
		if (null == amount) {
			return "0";
		}

		return amount.divide(VALUE_100).setScale(2, RoundingMode.FLOOR).toPlainString();
	}

	/**
	 * 金额由分转元
	 * 
	 * @param amount
	 * @return
	 * @author zp
	 * @date 2017-03-22 16:55:54
	 */
	public static BigDecimal fenToYuanDecimal(BigDecimal amount) {
		if (null == amount) {
			return BigDecimal.ZERO;
		}

		return amount = amount.divide(VALUE_100).setScale(2, RoundingMode.FLOOR);
	}

	/**
	 * 金额由分转元（只是做单位转换，四舍五入由调用方决定）
	 *
	 * @param amount
	 * @author wanghao
	 * @date 2017/3/20
	 * @return
	 */
	public static String fenToYuan(String amount) {
		if (StringUtils.isBlank(amount)) {
			return "0";
		}
		return fenToYuan(new BigDecimal(amount));
	}

	///////////////////////////////////////////////////////////////////////////////////////////////////////
	/**
	 * 金额由分转元（只是做单位转换，四舍五入由调用方决定）
	 * 
	 * @author changxd
	 * @date 2017-05-04
	 * @since 1.0.0
	 * @param amount
	 * @return
	 */
	public static double fenToYuan(int amount) {
		return new BigDecimal(Integer.toString(amount)).divide(VALUE_100).setScale(2, RoundingMode.FLOOR).doubleValue();
	}

	/**
	 * 金额由分转元(本方法不保留进度，请注意使用)
	 * 
	 * @author zp
	 * @date 2017-06-16 19:59:50
	 * @since 1.1.0
	 * @param amount
	 * @return
	 */
	public static int fenToYuanInt(int amount) {
		return new BigDecimal(Integer.toString(amount)).divide(VALUE_100).setScale(2, RoundingMode.FLOOR).intValue();
	}

	/**
	 * 金额由分转元(本方法不保留进度，请注意使用)
	 * 
	 * @author zp
	 * @date 2017-06-16 19:59:50
	 * @since 1.1.0
	 * @param amount
	 * @return
	 */
	public static long fenToYuanLong(long amount) {
		return new BigDecimal(Long.toString(amount)).divide(VALUE_100).setScale(2, RoundingMode.FLOOR).intValue();
	}

	/**
	 * 金额由分转元（只是做单位转换，四舍五入由调用方决定）
	 * 
	 * @author changxd
	 * @date 2017-05-04
	 * @since 1.0.0
	 * @param amount
	 * @return
	 */
	public static double fenToYuan(long amount) {
		return new BigDecimal(Long.toString(amount)).divide(VALUE_100).setScale(2, RoundingMode.FLOOR).doubleValue();
	}
}
